void read_by_fp_and_num(char *rec, FILE *fp, int num)
{
    // 记录总数
    int totalRec;
    // 数组大小为5的原因：fgets()会自动在末尾添加一个空字符(\0)
    char totalRecs[5];
    // 当前文件位置
    fpos_t pos;
    // 循环条件
    int i, j;
    // 所有记录的总长度
    int totalRecLen = 0;
    // 查询记录之前所有记录的总长度
    int preTotalRecLen = 0;
    // 查询记录的大小
    int queryRecLen;

    // 定位在文件开始的地方
    rewind(fp);
    // fseek(fp, 0, SEEK_SET);

    // 获取当前位置
    // fgetpos(fp, &pos);
    // printf("当前位置: %d\n", pos);

    // 得到记录总数(5-1)，位置改变
    totalRec = atoi(fgets(totalRecs, 5, fp));
    printf("记录总数: %d\n", totalRec);

    // 获取所有记录的总长度，并移动所有记录开始的位置
    for(i = 0; i < totalRec; i++)
    {
        totalRecLen += atoi(fgets(totalRecs, 5, fp));
    }
    printf("所有记录的总长度: %d\n", totalRecLen);

    // 判断查询记录是否存在
    if(num > totalRec || num <= 0)
    {
        fprintf(stderr, "记录不存在\n");
        exit(1);
    }
    else
    {
        // 定位到查询记录大小的开始位置，1个字 == 4个字节
        fseek(fp, 4 * num, SEEK_SET);
        fgetpos(fp, &pos);
        printf("定位到查询记录大小的开始位置: %d\n", pos);
        // 获取查询记录的大小
        queryRecLen = atoi(fgets(totalRecs, 5, fp));
        printf("查询记录的大小: %d\n", queryRecLen);

        // 定位到所有记录大小开始的位置
        fseek(fp, 4, SEEK_SET);
        // 获取查询记录之前所有记录的总长度
        for(j = 0; j < (num - 1); j++)
        {
            preTotalRecLen += atoi(fgets(totalRecs, 5, fp));
            printf("查询记录之前所有记录的总长度: %d\n", preTotalRecLen);
        }

        // 定位到查询记录开始的位置
        fseek(fp, 4 * (totalRec + 1) + preTotalRecLen, SEEK_SET);
        fgets(rec, queryRecLen + 1, fp);
        printf("查询到的记录: %s\n", rec);
    }
}

